/*
 * Copyright (c) 2023, 2023,yzc.cn All rights reserved.
 *
 */
package cn.yzc;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * <p>Project: RabbitMQ - Publisher</p>
 * <p>Powered by yzc On 2023-12-19 15:51:27</p>
 * <p>描述：<p>
 *
 * @author yzc [yzc0415@126.com]
 * @version 1.0
 * @since 17
 */

/**
 * 生产者
 */
public class Publisher {
    public static void main(String[] args) throws IOException, TimeoutException {

        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置虚拟机的名称
        factory.setVirtualHost("/");
        //用户名
        factory.setUsername("admin");
        //密码
        factory.setPassword("5672");
        //设置端口好
        factory.setPort(5672);
        //设置mq服务器地址
        factory.setHost("127.0.0.1");

        //2.创建连接
        Connection conn = factory.newConnection();

        //3.创建信道
        Channel channel = conn.createChannel();

        //4.声明队列
        String queueName = "queueOne"; //队列名称
        /**
         * @Param queue 队列持久化
         * @Param durable 指队列是否持久化，如何未false，mq服务器停止或重启时，队列会丢失
         * @Param exclusive 是否是独占连接 如果设置为true，那么生产者和消费者必须是同一个连接对象
         * @Param autoDelete 是否是自动删除 如何队列没有消息 没有生产者或消费者关联队列，为true自动删除队列
         * @Param arguments 队列中的参数
         */
        channel.queueDeclare(queueName,true,false,false,null);

        //5.同队列发送消息
        String msg = "hell0 world!";

        /**
         * @Param  exchnage 交换机 这里是simple 简单工作模式 设置为“”
         * @Param  路由键 用来说明消息发送到哪个队列上 在这里指定队列的名称
         * @Param  props 发送消息传递的属性
         * @Param body 消息内容
         */
        AMQP.BasicProperties props =new AMQP.BasicProperties();
        props=props.builder().appId("101")
                .contentEncoding("utf-8")
                .messageId("001")
                .build();
        channel.basicPublish("",queueName,props,msg.getBytes());

        //6.关闭连接 释放资源
        conn.close();

        System.out.println("消息发送完毕.....");

    }
}
